package com.zhanghp.class031;

/**
 * 给你两个整数 left 和 right ，表示区间 [left, right]
 * 返回此区间内所有数字 & 的结果
 * 包含 left 、right 端点
 * 测试链接 : https://leetcode.cn/problems/bitwise-and-of-numbers-range/
 *
 * @author zhanghp
 * @since 2024/4/8 15:24
 */
public class Code04_LeftToRightAnd {

    static class Solution {
        /**
         * <p>
         *     举例：
         *     right:10111
         *         & 10110
         *         & 10101
         *         。。。
         * </p>
         * <p>
         *     与上一个数<b>与</b>最右边的1就会与完后的结果是0，利用这个特性
         *     采用Brian算法，取出最右侧一，然后right减掉这个数
         * </p>
         *
         * @param left
         * @param right
         * @return
         */
        public int rangeBitwiseAnd(int left, int right) {
            while (left < right){
                right -= right & -right;
            }
            return right;
        }
    }
}
